package com.amos.doublewriterconsistence.config;

import com.amos.doublewriterconsistence.listen.InitThreadLocalPoolListen;
import org.springframework.boot.web.servlet.ServletListenerRegistrationBean;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;

/**
 * Copyright © 2018 五月工作室. All rights reserved.
 *
 * @Package com.amos.common.config
 * @ClassName ServletListenerRegistrationConfig
 * @Description 在容器启动的时候，注册自定义的Listener
 * 1. 在监听器中初始化线程池
 *
 * 原因：自定义Listener（监听器）中使用Spring容器管理的bean
 * Servlet容器在实例化RequestThreadPool并调用其方法之前， 要确保spring容器已经初始化完毕！
 * 需要先配置初始化spring容器的Listener，然后在配置自己的Listener，否则会注入失败；
 *
 * @Author Amos
 * @Modifier
 * @Date 2019/7/14 16:41
 * @Version 1.0
 **/
@Configuration
public class ServletListenerRegistrationConfig {

    /**
     * 注册自定义的Bean(
     * 自定义Listener（监听器）中使用Spring容器管理的bean)
     * 并且设置监听器，该监听器初始化线程池
     * （线程池：创建一些线程，使用池化技术来存储这些线程）
     * @return
     */
    @Bean
    public ServletListenerRegistrationBean registrationBean() {

        /**
         * 一、
         *
         * 一般在项目初始化的时候总会有些初始化操作，
         *  比如读取配置文件、初始化线程池、初始化数据字典、功能点扫描注册等等。
         *  毫无疑问这些需要通过监听器来实现。
         *  什么是监听器？
         *  通俗来讲，就是你（监听器）的全部注意力都在女神（被监听对象）身上，一旦女神抬头或者其他动作，你就本能的做出相应反应。
         *
         * 由于SpringBoot默认是以jar包的方式启动嵌入式的Servlet容器来启动SpringBoot的web应用，没有web.xml文件。
         * 故而采用其他方式来注册三大组件：代码注册和注解注册。
         * ServletRegistrationBean注册Servlet
         * FilterRegistrationBean注册Filter
         * ServletListenerRegistrationBean注册Listener
         *
         * 注册监听器：将监听器与事件源进行绑定（就是在web.xml文件配置监视器，部分监听不需要配置）
         */
        ServletListenerRegistrationBean servletListenerRegistrationBean = new ServletListenerRegistrationBean();

        /**
         * 二、
         * 需要向web容器中注册监听器，可以使用ServletListenerRegistrationBean来实现
         * setListener()是设置一个监听事件，其中InitThreadLocalPoolListen就是我们自定义的监听器，可以在通过该监听器实现我们需要处理的逻辑
         */
        servletListenerRegistrationBean.setListener(new InitThreadLocalPoolListen());

        return servletListenerRegistrationBean;
    }
}
